using System.Collections.Generic;
using NUnit.Framework;

namespace Drill.Core.Utilities
{
    [TestFixture]
    public class StringToBooleanConverterTests
    {
        [Category("UnitTest")]
        [Test]
        [TestCaseSource("TestCasesForCanConvert")]
        public bool CanConvert(string value, bool defaultValue)
        {
            bool result = StringToBooleanConverter.Convert(value, defaultValue);
            return result;
        }

        public static IEnumerable<TestCaseData> TestCasesForCanConvert
        {
            get
            {
                yield return new TestCaseData(null, false).Returns(false);
                yield return new TestCaseData(null, true).Returns(true);
                yield return new TestCaseData("", false).Returns(false);
                yield return new TestCaseData("", true).Returns(true);
                yield return new TestCaseData(" ", false).Returns(false);
                yield return new TestCaseData(" ", true).Returns(true);

                yield return new TestCaseData("0", true).Returns(false);
                yield return new TestCaseData("f", true).Returns(false);
                yield return new TestCaseData("F", true).Returns(false);
                yield return new TestCaseData("false", true).Returns(false);
                yield return new TestCaseData("False", true).Returns(false);
                yield return new TestCaseData("fALSE", true).Returns(false);
                yield return new TestCaseData("FALSE", true).Returns(false);
                yield return new TestCaseData("n", true).Returns(false);
                yield return new TestCaseData("N", true).Returns(false);
                yield return new TestCaseData("no", true).Returns(false);
                yield return new TestCaseData("No", true).Returns(false);
                yield return new TestCaseData("NO", true).Returns(false);

                yield return new TestCaseData(" 0", true).Returns(false);
                yield return new TestCaseData(" f", true).Returns(false);
                yield return new TestCaseData(" F", true).Returns(false);
                yield return new TestCaseData(" false", true).Returns(false);
                yield return new TestCaseData(" False", true).Returns(false);
                yield return new TestCaseData(" fALSE", true).Returns(false);
                yield return new TestCaseData(" FALSE", true).Returns(false);
                yield return new TestCaseData(" n", true).Returns(false);
                yield return new TestCaseData(" N", true).Returns(false);
                yield return new TestCaseData(" no", true).Returns(false);
                yield return new TestCaseData(" No", true).Returns(false);
                yield return new TestCaseData(" NO", true).Returns(false);

                yield return new TestCaseData("0 ", true).Returns(false);
                yield return new TestCaseData("f ", true).Returns(false);
                yield return new TestCaseData("F ", true).Returns(false);
                yield return new TestCaseData("false ", true).Returns(false);
                yield return new TestCaseData("False ", true).Returns(false);
                yield return new TestCaseData("fALSE ", true).Returns(false);
                yield return new TestCaseData("FALSE ", true).Returns(false);
                yield return new TestCaseData("n ", true).Returns(false);
                yield return new TestCaseData("N ", true).Returns(false);
                yield return new TestCaseData("no ", true).Returns(false);
                yield return new TestCaseData("No ", true).Returns(false);
                yield return new TestCaseData("NO ", true).Returns(false);

                yield return new TestCaseData(" 0 ", true).Returns(false);
                yield return new TestCaseData(" f ", true).Returns(false);
                yield return new TestCaseData(" F ", true).Returns(false);
                yield return new TestCaseData(" false ", true).Returns(false);
                yield return new TestCaseData(" False ", true).Returns(false);
                yield return new TestCaseData(" fALSE ", true).Returns(false);
                yield return new TestCaseData(" FALSE ", true).Returns(false);
                yield return new TestCaseData(" n ", true).Returns(false);
                yield return new TestCaseData(" N ", true).Returns(false);
                yield return new TestCaseData(" no ", true).Returns(false);
                yield return new TestCaseData(" No ", true).Returns(false);
                yield return new TestCaseData(" NO ", true).Returns(false);
                
                yield return new TestCaseData("1", false).Returns(true);
                yield return new TestCaseData("t", false).Returns(true);
                yield return new TestCaseData("T", false).Returns(true);
                yield return new TestCaseData("true", false).Returns(true);
                yield return new TestCaseData("True", false).Returns(true);
                yield return new TestCaseData("TRUE", false).Returns(true);
                yield return new TestCaseData("y", false).Returns(true);
                yield return new TestCaseData("Y", false).Returns(true);
                yield return new TestCaseData("yes", false).Returns(true);
                yield return new TestCaseData("Yes", false).Returns(true);
                yield return new TestCaseData("YES", false).Returns(true);

                yield return new TestCaseData(" 1", false).Returns(true);
                yield return new TestCaseData(" t", false).Returns(true);
                yield return new TestCaseData(" T", false).Returns(true);
                yield return new TestCaseData(" true", false).Returns(true);
                yield return new TestCaseData(" True", false).Returns(true);
                yield return new TestCaseData(" TRUE", false).Returns(true);
                yield return new TestCaseData(" y", false).Returns(true);
                yield return new TestCaseData(" Y", false).Returns(true);
                yield return new TestCaseData(" yes", false).Returns(true);
                yield return new TestCaseData(" Yes", false).Returns(true);
                yield return new TestCaseData(" YES", false).Returns(true);

                yield return new TestCaseData("1 ", false).Returns(true);
                yield return new TestCaseData("t ", false).Returns(true);
                yield return new TestCaseData("T ", false).Returns(true);
                yield return new TestCaseData("true ", false).Returns(true);
                yield return new TestCaseData("True ", false).Returns(true);
                yield return new TestCaseData("TRUE ", false).Returns(true);
                yield return new TestCaseData("y ", false).Returns(true);
                yield return new TestCaseData("Y ", false).Returns(true);
                yield return new TestCaseData("yes ", false).Returns(true);
                yield return new TestCaseData("Yes ", false).Returns(true);
                yield return new TestCaseData("YES ", false).Returns(true);

                yield return new TestCaseData(" 1 ", false).Returns(true);
                yield return new TestCaseData(" t ", false).Returns(true);
                yield return new TestCaseData(" T ", false).Returns(true);
                yield return new TestCaseData(" true ", false).Returns(true);
                yield return new TestCaseData(" True ", false).Returns(true);
                yield return new TestCaseData(" TRUE ", false).Returns(true);
                yield return new TestCaseData(" y ", false).Returns(true);
                yield return new TestCaseData(" Y ", false).Returns(true);
                yield return new TestCaseData(" yes ", false).Returns(true);
                yield return new TestCaseData(" Yes ", false).Returns(true);
                yield return new TestCaseData(" YES ", false).Returns(true);
            }
        }
    }
}